main(List<String> args) {
  const p1 = Person('why');
  const p2 = Person('why');
  print(identical(p1, p2));

  // -----------------

  final t1 = Person2.withName('name');
  final t2 = Person2.withName('name');
  final t3 = Person2.withColor('red');
  final t4 = Person2.withColor('red');
  print(identical(t1, t2));
  print(identical(t3, t4));
  print(identical(t1, t4));
}

// 普通的构造函数 会 返回一个对象
class Person {
  final String name;
  final String color = 'red';
  const Person(this.name);
}

// 工厂函数 主要就是为了节省内存 ( 保存的是对象的指针 )
// 工厂函数 需要手动返回一个对象 ( 最大的特点就是可以手动的返回一个对象 )
class Person2 {
  String name;
  String color;
  static final Map<String, Person2> _nameCache = {};
  static final Map<String, Person2> _colorCache = {};

  factory Person2.withName(String name) {
    // 映射判断是否包含 containsKey
    if (_nameCache.containsKey(name)) {
      return _nameCache[name];
    } else {
      // 没有找到
      final p = Person2(name, 'defalut');
      _nameCache[name] = p;
      return p;
    }
  }
  factory Person2.withColor(String color) {
    // 映射判断是否包含 containsKey
    if (_colorCache.containsKey(color)) {
      return _colorCache[color];
    } else {
      // 没有找到
      final p = Person2('无名', color);
      _colorCache[color] = p;
      return p;
    }
  }

  Person2(this.name, this.color);
}
